package ca.qc.bdeb.jeuxdesboites;

import ca.qc.bdeb.jeuxdesboites.commun.Coup;
import ca.qc.bdeb.event.ComponentSelectedEvent;
import ca.qc.bdeb.event.ComponentSelectedHandler;
import ca.qc.bdeb.event.ComponentSelectedListener;
import ca.qc.bdeb.graphiques.Sprite;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import javax.swing.event.EventListenerList;

/**
 * Un sprite pour représenter une barre dans le jeu.
 * 
 * @author Éric Wenaas
 * @version 0.3
 */
public class BarreSprite extends Sprite implements ComponentSelectedHandler, 
                                                   MouseListener {
    private boolean actif;
    private boolean ferme;
    private BufferedImage image;
    private EventListenerList ecouteurs;
    private Coup position;
    
    public BarreSprite(BufferedImage image, Coup position) {
        super();
        this.image = image;
        actif = false;
        ferme = false;
        ecouteurs = new EventListenerList();
        this.position = position;
        addMouseListener(this);
    }

    public void desactiverBarre() {
        if (! ferme) {
            actif = false;
        }
    }
    
    public void activerBarre() {
        if (! ferme) {
            actif = true;
        }
    }
    
    public Coup getPosition() {
        return position;
    }
            
    public void fermerBarre() {
        if (! ferme) {
            ferme = true;
            actif = false;
            setImage(image);
            repaint();
        }
    }
    
    public void ouvrirBarre() {
        ferme = false;
        setImage(null);
        repaint();
    }

    @Override
    public void mouseClicked(MouseEvent me) {
        if (actif) {
            ComponentSelectedEvent evenenement = new ComponentSelectedEvent(this);
            envoyerComponentSelectedEvent(evenenement);
        }
    }

    @Override
    public void mouseEntered(MouseEvent me) {
        if (actif) {
            setImage(image);
            repaint();
        }
    }

    @Override
    public void mouseExited(MouseEvent me) {
        if (actif) {
            setImage(null);
            repaint();
        }
    }

    @Override
    public void mousePressed(MouseEvent me) {
    }

    @Override
    public void mouseReleased(MouseEvent me) {
    }

    @Override
    public void addComponentSelectedListener(ComponentSelectedListener listener) {
        ecouteurs.add(ComponentSelectedListener.class, listener);
    }

    @Override
    public void removeComponentSelectedListener(ComponentSelectedListener listener) {
        ecouteurs.remove(ComponentSelectedListener.class, listener);
    }
    
    public void envoyerComponentSelectedEvent(ComponentSelectedEvent evt) {
        Object[] mesEcouteurs = ecouteurs.getListenerList();
        for (int i = 0; i < mesEcouteurs.length; i += 2) {
            if (mesEcouteurs[i] == ComponentSelectedListener.class) {
                ((ComponentSelectedListener) mesEcouteurs[i + 1]).onComponentSelectedEvent(evt);
            }
        }
    }
}
